#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright @ 2014 OPS, Qunar Inc. (qunar.com)
#
# Author: tingfang.bao <tingfang.bao@qunar.com>
# DateTime: 15-3-6 下午5:05
"""
flask的信号机制，需要blinker库的支持

信号：通过信号触发操作，实现解耦．允许发送者通知订阅者，某些事情发生了，并不提倡订阅者可以修改数据，只是通知他们好了．
有些信号与内置装饰器作用相近，比如
信号：request_started=>before_request()
但还是有区别的
before_request(): 按指定顺序执行，可以中断http请求
request_started信号：所有的信号handler是无序执行的，并且不能修改数据

1. 订阅信号
调用信号对象上的connect(handler, sender)方法．
    handler：一个方法，事件发生时，执行这个方法
    sender: 指定发送者

2. 退订
调用信号对象上的disconnect()

对于核心的flask信号，发送者都是app, 订阅信号时,必须制定发送者，否则会接受所有的事件，无论是谁发送的。
"""

from flask import Flask, render_template, Response, current_app
from blinker import Namespace

qunar_signals = Namespace()
openstack_vm_created = qunar_signals.signal("opsdb_created")

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html', items=10)


@app.route('/faq')
def faq():
    return render_template("faq.html")


@app.route('/created')
def opsdb_created():
    openstack_vm_created.send(app)
    return Response()


def fake_action(sender):
    print app.config
    print 'openstack-vm created...'


if __name__ == '__main__':
    openstack_vm_created.connect(fake_action, app)
    app.debug = True
    app.run(host='0.0.0.0', port=8080)

